DEFINITION MODULE coSym; (* Ned 25-May-88. (c) KRONOS *)
                         (* Ned 01-Nov-88. (c) KRONOS *)
                         (* Ned 15-Apr-90. (c) KRONOS *)

(* Модуль определяет стандарт симфайла (реффайла) *)

CONST -- Номера стандартных типов
  null      =  0;    (*              *)
  addr      =  1;    (* ADDRESS      *)
  word      =  2;    (* WORD         *)
  int       =  3;    (* INTEGER      *)
  char      =  4;    (* CHARACTER    *)
  real      =  5;    (* REAL         *)
  bool      =  6;    (* BOOLEAN      *)
  bitset    =  7;    (* BITSET       *)
  string    =  8;    (* STRING       == DYNARR OF CHAR *)
  uint      =  9;    (* universal INTEGER *)
  nan       = 31;    (* NAN          *)

CONST -- теги типовых значений

  enumtype  = 20h;     -- access
  range     = 21h;     -- X(base)  access
  array     = 22h;     -- X(index) X(base)
  openarr   = 23h;     -- X(base)
  pointer   = 24h;     --                     -- see linkage
  record    = 25h;     -- X(base)
  set       = 26h;     -- X(base)
  proctype  = 27h;     --
  functype  = 28h;     -- X(base)
  hidden    = 29h;     --
  linkage   = 2Ah;     -- X(pointer_type) X(base)
  dynarr    = 2Bh;     -- X(base) X(dimensions)
  class     = 2Ch;     -- X(base)
  newrange  = 2Dh;     -- X(base) access

CONST -- теги объектов и теги компонент

-- access ::  X(bytes) { byte }

  const     = 30h;     -- ident X(base) X(mod_no)  access
  enum      = 33h;     -- ident X(base) X(mod_no)  access

  var       = 34h;     -- ident X(base) X(kind)    access
  proc      = 35h;     -- ident X(base) X(proc_no) access

  type      = 36h;     -- ident X(base) X(mod_no)
  module    = 37h;     -- ident X(mod_no)

  parm      = 40h;     -- ident X(base) X(kind)    access
  field     = 41h;     -- ident X(base)            access
  method    = 42h;     -- ident X(base)            access

CONST -- биты в виде параметра и переменной
  varparam = 0;
  seqparam = 1;
  readonly = 2;

CONST -- определение внешнего модуля
  import    = 050h;    -- module_ident language_ident
                       -- X(def_time)  - время компиляции
                       --                def модуля
                       -- 1(module_kind)
                       -- access

CONST -- виды модулей
  def  = 0;     -- definition module
  imp  = 1;     -- implementaion module
  prog = 2;     -- program module

CONST -- дополнительные атомы
  strange   = 051h;    -- X(bytes) { byte }
  atrs      = 052h;    -- 1(number of atrs) { X(attribute) }
  xpos      = 053h;    -- X(proc_no) X(pc) 2(line) 1(col)
  endmodule = 054h;    -- X(mod_no)
  endproc   = 055h;    -- X(proc_no)
  end_CU    = 056h;    -- access
  packed    = 057h;    -- (* префикс перед упакованным типом *)
  eosf      = 0FDh;    -- end of symfile

CONST
  MAGIC   = 04D5953FFh; -- первое слово симфайла: "ЪSYM"
  VERSION = 5;          -- текущая версия

TYPE -- заголовок симфайла
  header = RECORD
             magic   : INTEGER;
             vers    : INTEGER;
             offset  : INTEGER;
             def_time: INTEGER;
             imp_time: INTEGER;
           END;

(***************************************************************

-------------------------  ПРИМЕЧАНИЕ  -------------------------
                         --------------

     Симфайл(реффайл)    состоит    из    заголовка,    некоторой
дополнительной  информации  (может  отстутствовать)  и  собствено
информации  о  объектах  модуля.  Далее  под словом симфайл будет
пониматься  эта информация. Заголовок содержит "волшебное" слово,
номер версии, смещение (в байтах) до начала собственно симфайла и
времена  компиляции  определяющего  и  реализующего модуля. Между
заголовком   и   симфайлом  может  рассполагаться  дополнительная
информация любой длины.
     Симфайл   -   это   последовательность  областей  видимости,
соответствующих  процедурам  и  модулям.  Область видимости - это
последовательность  атомов.  Атомами  являются  типовые значения,
компоненты,  объекты,  странные  сегменты,  элементы соответствия
срок   коду.   Все   типовые  значения  пронумерованы  в  порядке
появления,  причем  нумерация  начинается  с 32. Диапазон номером
[0..31]  используется для стандартных типов. Типовые значения для
стандартных   типов   в  симфайле  не  встречаются.  Каждый  атом
представлен  тегом  (1  байт)  за  которым идет (возможно пустая)
последовательность  атрибутов.  Представление атрибута может быть
фиксированой  длины  (например  1  байт),  быть упакованным (т.е.
занимать  разное  число  байтов  в  зависимости  от значения, или
являться последовательностью байтов указанной длины.
     Данный  модуль  определяет  константы  - номера стандартных
типов,  теги  объектов,  типовых  значений  и  компонент, и теги
оформления  симфайла  и  упакованных атрибутов. Для каждого тега
указан  набор  обязательных  атрибутов.  Используются  следуюшие
термины:
      base   - базовый тип (номер типа)
      index  - тип индекса (номер типа)
      size   - размер      (в словах)
      ident  - имя объекта    { byte } 0c
      mod_no - номер в списке импорта внешнего модуля, которому
               принадлежит объект.
               Все объекты у которых этот атрибут отсутствует,
               принадлежат модулю 0 (т.е. модулю, для которого
               построен симфайл).
      access - информация для генерации.
               число_байтов { байт }
   Используются следующие обозначения:
        1(имя_атрибута)  - атрибут занимает 1 байт
        X(имя_атрибута)   -  упакованный  атрибут

     За    каждым    атомом    может   идти   последовательность
дополнительных  атрибутов  состоящая  из тега, числа атрибутов и
упакованных атрибутов.

Метод упаковки атрибутов:
     значение |        интерпретация            |  диапазон
     ---------+---------------------------------+----------
     [8..255] |   значение-128                  |  -120..127
         0    |   значение следующего байта     |     0..255
         1    | - значение следующего байта     |  -255..0
         2    |   значение следующих 2 байтов   |     0..10000h
         3    |   значение следующих 4 байтов   |      все
     [4..7]   |   для расширений                |


  sym_file::
                header version
                { import }
                unit
                eosf
  unit::        { atom [ atrs ] }
  atom::        type_value | component | object | xpos | strange

***************************************************************)

END coSym.
